# -*- coding: utf-8 -*-

# Django

from django import template
from django.conf import settings
from django.core.cache import cache

# Helper apps

from quicktags.templatetags.quick_tag import quick_tag
from navmenu.models import Menu, MenuItem

register = template.Library()

@register.tag('navmenu')
@quick_tag
def navmenu(context, slug, template_dir = 'navmenu/ul'):
    """
    Seleciona um menu por `slug` e renderiza com o template `navmenu.html`
    dentro de `template_dir`.

    Exemplos:
        {% load navmenu %}
        {% navmenu 'canais' %}
        {% navmenu 'editorias' 'navmenu/a' %}
    """

    # Seleciona o menu pelo slug
    menukey = 'nav_%s%d' % (slug,settings.SITE_ID)
    menu = cache.get(menukey)
    if not menu:
        menu = Menu.objects.filter(slug=slug)[:1]
        cache.set(menukey,menu)
        
    if menu:
        menu = menu[0]
        # Adiciona o menu ao contexto global (o mesmo da view, com request e etc.)
        itemskey = 'navitems_%d' % menu.id
        items = cache.get(itemskey)
        if not items:
            items = menu.menuitem_set.filter(parent_item=None)
            cache.set(itemskey,items)
            
        context.update({'navmenu': {
            'menu': menu,
            'items': items,
            'template_dir': template_dir,
        }})

        # Renderiza o menu utilizando o contexto global
        return template.loader.render_to_string('%s/navmenu.html' % template_dir, context)

    return ''

@register.tag('navitem')
@quick_tag
def navitem(context, item, child=False):
    """
    Renderiza um item ou sub-item de menu com o template `navitem.html`
    dentro de `template_dir` definido na tag anterior `navmenu`.

    Exemplos:
        {% load navmenu %}
        {% navitem child %}
    """

    # Tenta capturar o endereço atual do request
    # Evita falha se o `django.core.context_processors.request` não estiver ativo
    try:
        path = context['request'].path
    except:
        path = None
    
    # Verifica se o caminho atual não é a raiz do site
    # e se começa com o link do item atual, o que indica
    # que o item ou um de seus filhos está ativo
    if path and (path != settings.BASE_URL + '/') and path.startswith(item.link):
        item.is_current = True

    # Atalho para o objeto que contém as informações do menu
    navmenu = context['navmenu']

    # Adiciona o item ao contexto
    navmenu.update({
        'item': item,
        'child': child,
    })
    
    return template.loader.render_to_string(['%s/navitem.html' % navmenu['template_dir']], context)
